<?php
/**
 * Controleur de la fonctionnalité "gérer les paniers"
 *
 */
    defined('_JEXEC') or die('Acces interdit');
    require_once CUSTOM_PATH_PHP_LIB.DS.'helper.php';
    require_once CUSTOM_PATH_INVOICES_HELPER.DS.'helpers.php';
		
    class PaniersController {
        
        //initialisation du controleur
        function __construct() {
            
        }
        
        // afficher la vue
        function display($customAction = '') {
            require_once CUSTOM_PATH_PANIERS.DS.'viewcreerpaniers.php';
        }
        
        
        /**
         * Recherche des items d'un contrat et les place dans un tableau organisé en 
         * T[Distribution_id][sku]         * 
         * 
         * @param type $invoiceId
         */
        function chercherItemsDansFacture($invoiceId) {
           
            $db = JFactory::getDBO();			
            $query = $db->getQuery(true);
            $query->select($db->quoteName(array('#__invoices_items.distribution_id', '#__invoices_items.sku', '#__invoices_items.amount'), array('distributionid','sku', 'amount')));			
            $query->from($db->quoteName('#__invoices_items'));           
            $query->where($db->quoteName('#__invoices_items.invoice_id') . ' = '. $db->quote((int) $invoiceId));          
            $query->order($db->quoteName('#__invoices_items.distribution_id') . ' ASC');
            $db->setQuery($query);

            // Load the results as an associative array
            $resultats = $db->loadAssocList();
            $items = array();
            for ($i=0;$i<count($resultats);$i++) {
                $items[$resultats[$i]['distributionid']][$resultats[$i]['sku']] = $resultats[$i]['amount'];
            };
            
            return $items;

        }
        
        /**
         * Cherche la date de distribution choisie par l'utilisateur pour une opération donnée
         * @param type $joomlaUserId
         * @param type $codeOperation
         */
        function chercherIdDistributionChoisie($joomlaUserId, $codeOperation) {
            
            //suppression de l'apartenance à toute les distributions de cette opération
            $listeDistribution = AmapHelper::getDistributions($codeOperation);
            $listeDistributionId = "";
            for($i=0;$i<count($listeDistribution);$i++) {
                if($listeDistributionId == ''){
                    $listeDistributionId = $listeDistribution[$i]['id'];
                } else {
                    $listeDistributionId .= ','.$listeDistribution[$i]['id'];
                };                               
            }
            $db = JFactory::getDBO();	
            $query = $db->getQuery(true);
            $query->select($db->quoteName(array('#__eb_registrants.event_id'), array('id')));			
            $query->from($db->quoteName('#__eb_registrants'));    
            $query->where($db->quoteName('event_id') . ' IN ( ' .$listeDistributionId . ')');
            $query->where($db->quoteName('user_id') . ' = '. (int) $joomlaUserId);
            $db->setQuery($query);
            $resultats = $db->loadAssocList();
            $idLu = 0;
            if (count($resultats) == 1) {
                $idLu = $resultats[0]['id'];
            };
            return (int) $idLu;
        }
        
        
        
        /**
         * Retourne la définition de  grille de saisie des paniers en fonction de l'opération en cours
         * la valeur de retour est un tableau associatif contenant 2 valeurs :
         *  - 'proprietes' : Propriétés des cellules de la grille
         *  - 'donnees' : Valeurs affichées dans les cellules de la grille
         * 
         */
        function definitionGrilleSaisie($codeOperation = '', $codeFamilleProduit = '') {
             
            
            //vérifie si une facture existe déjà dans la base pour ce user et cette opération
            $joomlaUserId = JFactory::getUser()->get('id');
            $joomlaUserName = JFactory::getUser()->get('name');
            $invoiceUserId = self::chercherUserInvoice($joomlaUserId, $joomlaUserName);
            $definition = array();
            
            //verification des droits du user
            //   A faire..            
              
            //recherche si une facture existe déjà pour cette opération et ce user
            $contrat = self::chercherContrat($invoiceUserId['id'], $codeOperation);
            $definition['statutdefinition'] = EStatut::EStatutOK;            
            switch (count($contrat)) {
               case 0:
                   //pas de facture : place des valeurs vides dans les cases de la grillle                   
                   $contratExistant = false;
                   break;

               case 1:
                   //Un contrat existant : récupère les valeurs courantes et les place dans la grille, 
                   //si le statut est bien 'préliminaire'                   
                    $itemsExistants = self::chercherItemsDansFacture($contrat[0]['id']);
                    $idDistributionChoisie = self::chercherIdDistributionChoisie($joomlaUserId, $codeOperation);
                    $contratExistant = true;
                    
                    if ($contrat[0]['statut'] !== 'preliminary') {
                       //Impossible de modifier le contrat
                       $definition['statutdefinition'] = EStatut::EStatutKO;
                    }
                    break;
              
               default :
                   return $definition['statutdefinition'] = EStatut::EStatutKO;                 
                           
            }
            
            //définition des constantes et variables de la grille
            $nombreColonnesHeader = 3;
            $nombreLignesHeader = 3;
            $classeCoinGrille = "grillePanierCorner";
            $classeHeaderGrille = "grillePanierHeader";
            $classeAlignementCentre = "htCenter";
           
            if ($codeOperation === '') {
                $codeOperation = JFactory::getApplication()->input->get(ECaracObjet::ECaracObjetCodeOperation, '', 'STRING');
            }
            if ($codeFamilleProduit === '') {               
                $codeFamilleProduit = JFactory::getApplication()->input->get(ECaracObjet::ECaracObjetCodeFamilleProduit, '', 'STRING');
            }            
           
            $distributions = AmapHelper::getDistributions($codeOperation);
            $produits = AmapHelper::getProductsDetails($codeFamilleProduit);          
            
            //construction des tableaux contenant les données et la mise en forme de cellules
            $props = array(); 
            $columns = array();
            $datas = array();            
            $headerLines[0]  = array();
            $headerLines[1]  = array();  
            $headerLines[2]  = array();
            $colWidths = array();
            $colonneChoixDistribution = 2;
            
            //1 produit par colonne de la grille de saisie  
            $nombreColonnesGrille = count($produits) + $nombreColonnesHeader;
            $nombreLignesGrille = count($distributions) + $nombreLignesHeader;
            
            //Header de colonnes           
            for ($i=0;$i < $nombreColonnesHeader;$i++) {
                array_push ($headerLines[0], ""); array_push($props, self::creerObjetPropriete($i, 0, true, $classeCoinGrille.' '.$classeAlignementCentre));  
                array_push ($headerLines[1], ""); array_push($props, self::creerObjetPropriete($i, 1, true, $classeCoinGrille.' '.$classeAlignementCentre));  
                array_push ($headerLines[2], ""); array_push($props, self::creerObjetPropriete($i, 2, true, $classeCoinGrille.' '.$classeAlignementCentre));  
            } 
            array_push ($colWidths, 160);
            array_push ($colWidths, 1);
            array_push ($colWidths, 20);
            
            //Type et propriétés des colonnes : pour les 3 colonnes d'en-tête
            $myObject = new stdClass();
            array_push ($columns, $myObject);
            array_push ($columns, $myObject);
            $myObject = new stdClass();
            $myObject->type = "checkbox";
            array_push ($columns, $myObject);
            
            for ($i = 0;$i < count($produits);$i++) {                
               array_push ($headerLines[0], $produits[$i]['reference-produit']); array_push($props, self::creerObjetPropriete($i + $nombreColonnesHeader, 0, true, $classeHeaderGrille.' '.$classeAlignementCentre,'','','',$produits[$i]['nomproduit']));
               array_push ($headerLines[1], $produits[$i]['prix-unitaire']); array_push($props, self::creerObjetPropriete($i + $nombreColonnesHeader, 1, true, $classeHeaderGrille.' '.$classeAlignementCentre));
               array_push ($headerLines[2], $produits[$i]['quantite-lot']); array_push($props, self::creerObjetPropriete($i + $nombreColonnesHeader, 2, true, $classeHeaderGrille.' '.$classeAlignementCentre));
               array_push ($colWidths, 100);
               
               //Type et propriétés des colonnes : pour les colonnes contenant un produit
               $myObject = new stdClass();
               $myObject->type = "numeric";
               $myObject->format = "0.[000]";
               $myObject->allowInvalid = false;
               array_push ($columns, $myObject);
            }           
            
            array_push ($datas,$headerLines[0]);
            array_push ($datas,$headerLines[1]);
            array_push ($datas,$headerLines[2]);
            
            
            //boucle sur les distributions            
            for ($j=0;$j < count($distributions);$j++) {
                
                $dataLine = array();                    
                $date = DateTime::createFromFormat(FORMAT_DATE_BASE_DE_DONNEES, $distributions[$j]['date']);
                $dateFormatee = $date->format('d-m-Y');
                //$dateFormatee = $date->format('Y-m-d');
                //setlocale(LC_TIME, "fr");
                //$date2 = strftime("%A %d %B %Y",strtotime($dateFormatee)); 
               
                //coche la case de la distribution choisie si besoin
                if ($distributions[$j]['id'] == $idDistributionChoisie) {
                    $distributionCochee = true;
                } else {
                    $distributionCochee = false;
                }
                
                array_push ($dataLine, $dateFormatee); array_push($props, self::creerObjetPropriete(0, $j + $nombreLignesHeader, true, $classeHeaderGrille.' '.$classeAlignementCentre));
                array_push ($dataLine, $distributions[$j]['id']); array_push($props, self::creerObjetPropriete(1, $j + $nombreLignesHeader, true, $classeHeaderGrille.' '.$classeAlignementCentre));               
                array_push ($dataLine, $distributionCochee); array_push($props, self::creerObjetPropriete(2, $j + $nombreLignesHeader, '', $classeAlignementCentre, '', $distributions[$j]['date']));             
                for ($i = 0;$i < count($produits);$i++) {
                    
                    //place la valeur du contrat existant ou une valeur vide selon le cas
                    if  ($contratExistant === false) {
                        $valeur = "";
                    } else {
                        if(isset($itemsExistants[$distributions[$j]['id']][$produits[$i]['reference-produit']])) {
                            $valeur = $itemsExistants[$distributions[$j]['id']][$produits[$i]['reference-produit']];
                            if (is_numeric($valeur)) $valeur = floatval($valeur);
                        } else {
                            $valeur = "";
                        }
                    }
                    
                    array_push ($dataLine, $valeur); array_push($props, self::creerObjetPropriete($i + $nombreColonnesHeader, $j + $nombreLignesHeader, '', $classeAlignementCentre, $produits[$i]['reference-produit'], $distributions[$j]['date'], $distributions[$j]['id']));   
                }                 
                array_push ($datas,$dataLine);
            }
                   
            //renvoi du résultat : Tableau contenant le valeurs (ou tableaux) définissant la grille de saisie
            $definition['donnees'] = $datas;
            $definition['proprietes'] = $props;
            $definition['columns'] = $columns;
            $definition['maxCols'] = $nombreColonnesGrille;
            $definition['maxRows'] = $nombreLignesGrille;
            $definition['colspan'] = $nombreColonnesHeader;
            $definition['rowspan'] = $nombreLignesHeader;
            $definition['colWidths'] = $colWidths;
            $definition['headerLines'] = $nombreLignesHeader;
            $definition['colonnechoixdistribution'] = $colonneChoixDistribution;
            $definition['datescheques'] = self::chercherDatesCheques($codeOperation);
            $definition['montantscheques'] = self::chercherMontantsCheques($contrat[0]['id']);
            $definition['ligneprixunitaire'] = 1;
            $definition['lignequantitelot'] = 2;
            
            return $definition;
        }
        
        /**
         *  Cherche le montant des chèques en cas de paiements multiples
         * 
         * @param type $invoiceId
         */
        function chercherMontantsCheques ($invoiceId) {
            $db = JFactory::getDBO();	
            $query = $db->getQuery(true);
            $query->select($db->quoteName(array('#__invoices_payments.payment_amount'), array('montant')));			
            $query->from($db->quoteName("#__invoices_payments"));
            $query->where($db->quoteName('#__invoices_payments.invoice_id') . ' = '. (int) $invoiceId);   
            $query->order($db->quoteName('#__invoices_payments.payment_duedate') . ' ASC');
            $db->setQuery($query);
            $resultats = $db->loadAssocList();
            return $resultats;
            
        }
        
        /**
         * Cherche la date d'encaissement des chèques en cas de paiements multiples
         * 
         * @param type $codeOperation
         */
        function chercherDatesCheques ($codeOperation) {

            $valeurChampsCustoOperation = AmapHelper::chercherChampsCusto($codeOperation);
            $datesNettoyees = array ();
            for($i=0;$i<count($valeurChampsCustoOperation);$i++){
                $nomParam = substr($valeurChampsCustoOperation[$i], 0,strlen(LABEL_CHEQUE));
                if ($nomParam == LABEL_CHEQUE) {
                    $dateNettoyee = substr($valeurChampsCustoOperation[$i], strpos($valeurChampsCustoOperation[$i],'=') + 1);
                    $dateNettoyee = str_replace('"', '', $dateNettoyee);
                    if (trim($dateNettoyee) != ''){
                        array_push($datesNettoyees, $dateNettoyee);
                    };
                }
            };
            return $datesNettoyees;            
        }        
        
               
        
        /**
         * Verifie si un user du composant 'invoice' existe pour le user joomla courant.
         * Si il n'existe pas, le crée et renvoie son id
         * 
         * @param type $joomlaUserID
         */
        function chercherUserInvoice($joomlaUserID, $joomlaUserName){
            
            //Query definition
            $db = JFactory::getDBO();			
            $query = $db->getQuery(true);
            $query->select($db->quoteName(array('#__invoices_contacts.id'), array('id')));			
            $query->from($db->quoteName('#__invoices_contacts'));           
            $query->where($db->quoteName('#__invoices_contacts.user_id') . ' = '. (int) $joomlaUserID);

            // Reset the query using our newly populated query object.
            $db->setQuery($query);
            $resultats = $db->loadAssocList();
            
            switch (count($resultats)) {                
                case 0:
                     // Crée un objet contenant les paramètres du user
                    $newUser = new stdClass();
                    $newUser->user_id = intval($joomlaUserID);
                    $newUser->name = $joomlaUserName;
                    
                    // Insert the object into the table
                    $result = $db->insertObject('#__invoices_contacts', $newUser, 'id');            
                    if (!$result) {
                        return 0;
                    } else {
                        return (int)$db->insertid();
                    }
                    break;
                    
                case 1:
                    $invoiceUserId = $resultats[0];
                    break;
                    
                default:
                    //si supérieur à 1, erreur (2 user invoice pour un seul user joomla)
                    break;
            }
            
            return $invoiceUserId;            
        }
        
        /**
         * Recherche si un contrat  existe déjà pour une opération et un user donné
         * Si oui, retourne l'id du contrat et son statut
         * 
         * @param type $invoiceUserId
         * @param type $codeOperation
         * @return int
         */
        function chercherContrat($invoiceUserId, $codeOperation) {
            
            $db = JFactory::getDBO();			
            $query = $db->getQuery(true);
            $query->select($db->quoteName(array('#__invoices_invoices.id', '#__invoices_invoices.status'), array('id','statut')));			
            $query->from($db->quoteName('#__invoices_invoices'));           
            $query->where($db->quoteName('#__invoices_invoices.user_id') . ' = '. $db->quote((int) $invoiceUserId));
            $query->where($db->quoteName('#__invoices_invoices.external_type') . " LIKE '%".ECaracObjet::ECaracObjetCodeOperation."=".$codeOperation."%'");
            $db->setQuery($query);
            $resultats = $db->loadAssocList();            
           
            return $resultats;
        }
        
        //crée un objet de définition de propriétés pour une cellule de la grille
        function creerObjetPropriete ($col, $row, $readOnly = '', $className = '', $referenceproduit = '', $nomdistribution = '', $iddistribution = '', $comment = ''){
            $prop = new stdClass;
            $prop->col = $col;
            $prop->row = $row;
            if ($readOnly !== '') $prop->readOnly = $readOnly;
            if ($className !== '') $prop->className = $className;
            if ($referenceproduit !== '') $prop->referenceproduit = $referenceproduit;
            if ($nomdistribution !== '') $prop->nomdistribution = $nomdistribution;
            if ($iddistribution !== '') $prop->iddistribution = $iddistribution;  
            if ($comment !== '') $prop->comment = $comment;  
            
            return $prop;
        }
        
        /* Création d'une facture à partir de la composition du panier saisie dans la grille
         * 
         */
        function remplirPanier() {
            
            //recherche les données de la grille, issue du post AJAX
            $jinput = JFactory::getApplication()->input;            
            $codeOperation = $jinput->get('codeoperation', '', 'STRING');
            $libelleOperation = $jinput->get('libelleoperation', '', 'STRING');
            $codeFamilleProduits = $jinput->get('codefamilleproduits', '', 'STRING');
            $donneesJSON = $jinput->get('donnees', '[]', 'STRING');
            $donnees = json_decode($donneesJSON, true); 
            $montantPanier = $jinput->get('montantpanier', 0, 'FLOAT');
            $montantsCheques = json_decode($jinput->get('montantscheques', '[]', 'STRING'),true);
            
            //recherche de la définition des propriétés la grille
            $definitionGrille = PaniersController::definitionGrilleSaisie($codeOperation,$codeFamilleProduits);  
                        
            //recherche du user 'invoice'
            $joomlaUserId = JFactory::getUser()->get('id');
            $joomlaUserName = JFactory::getUser()->get('name');
            $invoiceUserId = self::chercherUserInvoice($joomlaUserId, $joomlaUserName);
            
            //verifie qu'une date de distribution est saisie
            $idDistributionChoisie = 0;
            $colonnechoixdistribution = $definitionGrille['colonnechoixdistribution'];
            for ($i=$definitionGrille['headerLines'];$i<count($donnees);$i++) {                 
                if($donnees[$i][$colonnechoixdistribution] == 1){
                        $idDistributionChoisie = $donnees[$i][1];
                }
            } 
            
            //si la distribution n'est pas choisie, retour d'une erreur
            if ($idDistributionChoisie == 0) {
                return 'Il faut impérativement choisir une date de distribution !<br><br>Le panier n\'a pas été validé.';
            }            
              
            //recherche si une facture existe déjà pour cette opération et ce user
            $contrat = self::chercherContrat($invoiceUserId['id'], $codeOperation);
            $erreurTraitement = false;
            switch (count($contrat)) {
               case 0:
                   //pas de facture : La créee, et renseigne les items qu'elle contient
                   $statutCreationPanier = self::creerContrat ($invoiceUserId['id'], $codeOperation, $codeFamilleProduits, $definitionGrille, $donnees, 0, $montantPanier, $montantsCheques);                                      
                   break;

               case 1:
                   //Un contrat existant : vérifie le statut
                   if ($contrat['statut'] !== 'preliminary') {
                       
                       //un contrat préliminaire existe : Le supprime pour recréer le contrat mis à jour
                       $db = JFactory::getDbo();
                       $query = $db->getQuery(true);
                       $conditions = $db->quoteName('id') . ' = '. (int) $contrat[0]['id'];
                       $query->delete($db->quoteName('#__invoices_invoices'));
                       $query->where($conditions);
                       $db->setQuery($query);
                       $resultat = $db->query();
                       
                       $conditions = $db->quoteName('invoice_id') . ' = '. (int) $contrat[0]['id'];
                       $query = $db->getQuery(true);
                       $query->delete($db->quoteName('#__invoices_payments'));
                       $query->where($conditions);
                       $db->setQuery($query);
                       $resultat = $db->query();
                       
                       $query = $db->getQuery(true);
                       $query->delete($db->quoteName('#__invoices_items'));
                       $query->where($conditions);
                       $db->setQuery($query);
                       $resultat = $db->query();
                       
                       //suppression de l'apartenance à l'opération 
                       $query = $db->getQuery(true);
                       $query->delete($db->quoteName('#__eb_registrants'));
                       $query->where($db->quoteName('event_id') . ' = '. (int) AmapHelper::getOperationId($codeOperation));
                       $query->where($db->quoteName('user_id') . ' = '. (int) $joomlaUserId);
                       $db->setQuery($query);
                       $resultat = $db->query();
                       
                       //suppression de l'apartenance à toute les distributions de cette opération
                       $listeDistribution = AmapHelper::getDistributions($codeOperation);
                       $listeDistributionId = "";
                       for($i=0;$i<count($listeDistribution);$i++) {
                           if($listeDistributionId == ''){
                               $listeDistributionId = $listeDistribution[$i]['id'];
                           } else {
                               $listeDistributionId .= ','.$listeDistribution[$i]['id'];
                           };                               
                       }
                       $query = $db->getQuery(true);
                       $query->delete($db->quoteName('#__eb_registrants'));
                       $query->where($db->quoteName('event_id') . ' IN ( ' .$listeDistributionId . ')');
                       $query->where($db->quoteName('user_id') . ' = '. (int) $joomlaUserId);
                       $db->setQuery($query);
                       $resultat = $db->query();                       
                       
                       //création du contrat
                       $statutCreationPanier = self::creerContrat ($invoiceUserId['id'], $codeOperation, $codeFamilleProduits, $definitionGrille, $donnees, $contrat['id'], $montantPanier, $montantsCheques);
                                              
                   } else {
                       //ne fait rien : impossible d'éditer un contrat non préliminaire
                       $statutCreationPanier = "Modification du contrat impossible s'il n'est pas à l'état \'préliminaire\'";
                   }
                   break;

               default:
                   //si supérieur à 1, erreur !!! (2 contrats pour un seul user et une opération = impossible)
                   $erreurTraitement = false;
                   break;
            };
            
            //si tout est OK, ajoute le user à la distribution choisie et à l'opération
            if ($erreurTraitement === false){
                
                //ajoute le user en tant que participant à l'opération
                $db = JFactory::getDbo();
                $registrant = new stdClass;
                $registrant->event_id = AmapHelper::getOperationId($codeOperation);
                $registrant->user_id = $joomlaUserId;
                $registrant->first_name = $joomlaUserName;
                $registrant->last_name = $libelleOperation;
                $registrant->published = 1;
                $result = $db->insertObject('#__eb_registrants', $registrant, 'id');            

                //ajoute le user en tant que participant à la distribution choisie
                $registrant = new stdClass;
                $registrant->event_id = $idDistributionChoisie;
                $registrant->user_id = $joomlaUserId;
                $registrant->first_name = $joomlaUserName;
                $registrant->last_name = $libelleOperation;
                $registrant->published = 1;
                $result = $db->insertObject('#__eb_registrants', $registrant, 'id');                 
            }
            
            //retour ajax
            return $statutCreationPanier;
        }
        
        /**
         * Création du contrat (=facture du composant invoice) à partir du contenu de la grille de saisie des paniers
         * 
         * @param type $codeOperation
         * @param type $codeFamilleProduits
         * @param type $definitionGrille
         * @param type $donnees
         * @return string
         */
        function creerContrat ($invoiceUserId, $codeOperation, $codeFamilleProduits, $definitionGrille, $donnees, $idContratExistant = 0, $montantPanier, $montantsCheques) {            
            
            //création de la facture
            $newInvoice = new stdClass();
            if ($idContratExistant !== 0) {
                $newInvoice->id = $idContratExistant;
            }
            $newInvoice->created_by = intval(USER_CREATION_CONTRAT);
            $newInvoice->user_id = intval($invoiceUserId);
            $newInvoice->added = AmapHelper::convertDateToMySQL();
            $newInvoice->invoice_date = AmapHelper::convertDateToMySQL();
            $newInvoice->invoice_num = $codeFamilleProduits.'-'.$codeOperation.'-'.$invoiceUserId;
            $newInvoice->template_id = intval(ID_TEMPLATE_CONTRAT);
            $newInvoice->external_type = ECaracObjet::ECaracObjetCodeOperation."=".$codeOperation;
            $newInvoice->publish = 1;
            $newInvoice->currency_after = "€";
            $newInvoice->status = "preliminary"; 

            // Insert the object into the 'invoices' table
            $db = JFactory::getDbo();
            $result = $db->insertObject('#__invoices_invoices', $newInvoice, 'id');            
            if (!$result) {
                return 0;
            } else {
                $invoiceId = (int)$db->insertid();
            }               
            
            //boucle sur les proprietes de la grille pour trouver les cases contenant des données à stocker
            $proprietes = $definitionGrille['proprietes'];
            $compteur = 1;
            foreach ($proprietes as $propriete) {
                if (isset($propriete->referenceproduit)) {
                    $row = $propriete->row;
                    $col = $propriete->col;
                    $iddistribution = $propriete->iddistribution;
                    $referenceProduit = $propriete->referenceproduit;
                    $nomProduit = $propriete->comment;
                    
                    //lit la valeur saisie
                    $quantiteLue = floatval($donnees[$row][$col]);
                    $datedistribution = $donnees[$row][0];
                    $prixunitaire = floatval($donnees[1][$col]);
                    
                    if ($quantiteLue != '') {
                        //création d'un objet pour insertion dans la base de données
                        $newItem = new stdClass();
                        $newItem->invoice_id = $invoiceId;
                        $newItem->name = $nomProduit;
                        $newItem->desc = $datedistribution;
                        $newItem->value = $prixunitaire;
                        $newItem->amount = $quantiteLue;
                        $newItem->ordering = $compteur;
                        $newItem->sku = $referenceProduit;
                        $newItem->product_id = 0;
                        $newItem->distribution_id = $iddistribution;

                        // Insert the object into the 'invoices' table
                        $result = $db->insertObject('#__invoices_items', $newItem, 'id');   
                        $compteur++;
                        unset($newItem);
                    }
            
                }
            } 
            
            //calcul du montant de la facture
            InvoicesHelper::updateComputedStatus($invoiceId, true, true);
            $montantRecalcule = InvoicesHelper::get_total_from_id($invoiceId);
            $datesCheques = self::chercherDatesCheques($codeOperation);
            
            //création des paiments
            for ($i=0;$i<count($montantsCheques);$i++){
                
                //création d'un payment
                $newPayment = new stdClass();
                $newPayment->invoice_id = $invoiceId;
                $newPayment->created_datetime = AmapHelper::convertDateToMySQL();
                $newPayment->payment_status = 0;
                $newPayment->ordering = 1;
                $newPayment->payment_amount = $montantsCheques[$i];
                $newPayment->payment_duedate = AmapHelper::convertDateToMySQL($datesCheques[$i]);

                // Insert the object into the 'payments' table
                $result = $db->insertObject('#__invoices_payments', $newPayment, 'id');            
            }
            
            if (round($montantPanier,2) == round($montantRecalcule,2)){
                $statutCreationPaiement = "Montants OK";
            } else {
                $statutCreationPaiement = "Montants non cohérent ==> A CORRIGER EN ADMIN !!";
            }
            
            if ($idContratExistant === 0) {
                $statutCreationPanier = "Création du contrat préliminaire :\n    ".$statutCreationPaiement;
            } else {
                $statutCreationPanier = "Modification du contrat préliminaire :\n    ".$statutCreationPaiement;
            }
            
            return $statutCreationPanier;
        }
    }
    
?>